package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.UserTestDao;
import com.itheima.entity.PageResult;
import com.itheima.pojo.Role;
import com.itheima.pojo.User;
import com.itheima.service.UserTestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import redis.clients.jedis.JedisPool;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserTestServiceImpl implements UserTestService {
    @Autowired
    private UserTestDao userTestDao;

    @Autowired
    private JedisPool jedisPool;


    /**
     * 根据userid 删除  缓存中的 username
     */
    public void delUsernamesByUserId(Integer userId) {
        User user = userTestDao.delUsernamesByUserId(userId);
        jedisPool.getResource().del(user.getUsername());

    }


    /**
     * 分页查所有
     */
    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
        //传入页码和每页记录数
        PageHelper.startPage(currentPage,pageSize);
        //传入查询条件
        Page<User> page = userTestDao.selectByQueryPageBean(queryString);
        //返回PageResult
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     *新增用户,角色列表回显
     */
    @Override
    public List<Role> findRoleAll() {
         List<Role> findRoleAll = userTestDao.findRoleAll();
         return findRoleAll;
    }

    /**
     *新增用户
     */
    @Override
    public void add(User user, Integer[] roleIds) {
        String password = user.getPassword();
        //把密码改成密文
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        String encodePassword = encoder.encode(password);
        user.setPassword(encodePassword);
        userTestDao.add(user);
        setUserAndRole(user.getId(),roleIds);
    }

    public void setUserAndRole(Integer userId,Integer[] roleIds){
        //判断roleIds是否为空
        if (roleIds != null && roleIds.length >0){
            for (Integer roleId : roleIds) {
                Map<String,Integer> map = new HashMap<String,Integer>();
                map.put("user_id",userId);
                map.put("role_id",roleId);

                //判断中间表是否添加成功
                int count = userTestDao.setUserAndRole(map);
                //成功则清除缓存
                if (count>0) {
                    delUsernamesByUserId(userId);
                }
            }
        }
    }
    /**
     * 编辑用户-根据用户id回显用户信息
     */
    @Override
    public User findById(Integer userId) {
        return userTestDao.findById(userId);
    }
    /**
     * 编辑用户-根据用户id查询角色ids
     */
    @Override
    public List<Integer> findRoleIdsByUserId(Integer id) {
        return userTestDao.findRoleIdsByUserId(id);
    }
    /**
     * 编辑用户-保存用户信息
     */
    @Override
    public void edit(User user, Integer[] roleIds) {
        //将新密码改成密文存储到数据库
        String passWord = user.getPassword();
        if (passWord != null && passWord.length() > 0){
            //把密码改成密文
            BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
            String encodePassword = encoder.encode(passWord);
            user.setPassword(encodePassword);
        }
        //1：根据用户id删除中间表数据（清理原有关联关系）
        int count1 = userTestDao.deleteAssociation(user.getId());
        //成功则清除缓存
        if (count1 > 0 ) {
            delUsernamesByUserId(user.getId());
        }
        //2：向中间表(t_user_role)插入数据（建立用户和角色关联关系）
        setUserAndRole(user.getId(),roleIds);
        //3：更新用户基本信息
        userTestDao.edit(user);
    }

    /**
     * 删除用户
     */
    @Override
    public void deleteById(Integer id) {
        //查询此用户是否为管理员
        Integer cnt = userTestDao.deleteIfadmin(id);
        if (cnt > 0){
            throw new RuntimeException("此用户是管理员，不能删除");
        }
        //查询用户和角色中间表
        Integer cnt1 = userTestDao.findUserRole(id);
        if (cnt1 > 0){
            userTestDao.deleteUserRole(id);
            userTestDao.deleteById(id);
        }else {
            userTestDao.deleteById(id);
        }

        delUsernamesByUserId(id);
    }
}
